/*
 * Copyright 2006-2009 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package asphalt2.action
{
	import asphalt2.util.Async;
	
	import flash.display.DisplayObject;
	import flash.events.Event;
	
	/**
	 * AbstractAction
	 *
	 * @author c9katayama
	 */
	public class AbstractAction
	{
		protected var _event:Event;
		
		public function createHandler():Function{
			return handleEvent;
		}
		public function doAction():void{
			handleEvent(null);
		}		
		protected function handleEvent(e:Event):void{
		}
		
		protected function invokeNext(invokeFunction:Function,callBackFunction:Function):void{
			if(invokeFunction == null){
				callBackFunction();
			}else{
				if(invokeSync(invokeFunction,callBackFunction)){
					return;
				}
				if(invokeAsyncWithAsync(invokeFunction,callBackFunction)){
					return;
				}
				if(invokeAsyncWithFunction(invokeFunction,callBackFunction)){
					return;
				}
				throw new ArgumentError("invoke fail.Invalide arguments.");
			}
		}
		protected function invokeSync(invokeFunction:Function,callBackFunction:Function):Boolean{
			var returnValue:* = null;
			try{
				returnValue = invokeFunction();
			}catch(e:ArgumentError){
				return false;
			}
			callBackFunction(returnValue);
			return true;
		}
		protected function invokeAsyncWithAsync(invokeFunction:Function,callBackFunction:Function):Boolean{
			var async:Async = new Async(callBackFunction);
			try{
				invokeFunction(async);
			}catch(e:ArgumentError){
				return false;
			}
			return true;
		}
		protected function invokeAsyncWithFunction(invokeFunction:Function,callBackFunction:Function):Boolean{
			try{
				invokeFunction(callBackFunction);
			}catch(e:ArgumentError){
				return false;
			}
			return true;			
		}
				
		public function handlerActionDispose(e:*=null):void{
			_event = null;					
		}
	}
}